/*petclub.c--使用二叉树*/
#include <stdio.h> 
#include <string.h>
#include <ctype.h>
#include "tree.h"

char menu(void);
void addpet(Tree* pt);
void droppet(Tree* pt);
void showpets(const Tree* pt);
void findpet(const Tree* pt);
void printitem (Item item);
void uppercase(char* str);
char* s_gets(char* st, int n);

int main(void)
{
	Tree pets;
	char choice;
	
	InitializeTree(&pets);				
	while ( (choice = menu()) != 'q')	//调用菜单提示函数，并接受输入的第一个字母
	{
		switch (choice)					//根据输入的字母不同，调用不同的功能
		{
			case 'a': addpet(&pets);
				break;
			case 'l': showpets(&pets);
				break;
			case 'f': findpet(&pets);
				break;
			case 'n': pringf("%d 个宠物在俱乐部里\n", TreeItemCount(&pets));
				break;
			case 'd': droppet(&pets);
				break;
			default: puts("没有进行选择");
		}
	}
	DeleteAll(&pets);
	puts("再见");
	
	return 0;
}

//菜单提示，输入选项
char menu(void)				
{
	int ch;
	
	puts("纳夫维尔宠物俱乐部会员计划");
	puts("输入一个字母选择你的选项") ;
	puts("a是添加一个宠物", "l是显示宠物清单", "n是显示宠物数量", "f是发现宠物", "d是删除宠物", "q是退出");
	while ( (ch = getchar()) != EOF)	//调用getchar()，同时把输入的第一个字符赋值给ch（没有while循环的getchar()只调用一次）
	{
		while(getchar != '\n')			//如果不遇到换行符，就一直保持输入
			continue;
		ch = tolower(ch);				//内置函数，把给定的字符转换为小写字符
		if (strchr("alrfndq",ch) == NULL) //如果输入的字母没有一个选项匹配，输出提示。如果匹配了，跳出循环。
			puts("请输入一个选项");
		else 
			break;
	}
	if (ch == EOF)
		ch = 'q';
	return ch;
}

//添加宠物名字到树的节点的内容中
void addpet(Tree* pt)				
{
	Item temp;
	
	if (TreeeIsFull(pt))
		puts("俱乐部里没有空间了");
	else
	{
		puts("请输入宠物的名字:");
		s_gets(temp.petname,SLEN);	//把宠物的名字赋值给新节点内容temp的宠物名字中
		puts("请输入宠物品种:");
		s_gets(temp.petkind,SLEN);	//把宠物的品种赋值给新节点内容temp的宠物品种中
		uppercase(temp.petname);	//
		uppercase(temp.petkind);	//
		AddItem(&temp, pt);			//把新节点的内容添加到树中
	}
}

//显示已经赋值的宠物节点
void showpets(const Tree* pt)		
{
	if (TreeIsEmpty(pt))			//如果是空的,就显示没有宠物.如果不是空的,就给每个节点调用显示函数printitem()
		puts("没有宠物");
	else
		Traverse(pt, printitem);
}
void printitem(Item item)
{
	printf("宠物: %-19s\n", item.petname, item.petkind);
}

//查找宠物节点
void findpet(const Tree* pt)		//输入树的指针,新建一个节点,然后
{
	Item temp;
	
	if (TreeIsEmpty(pt))
	{
		puts("没有宠物");
		return;		//退出该函数 
	}
	
	puts("请输入寻找的宠物名:");
	s_gets(temp.petname, SLEN);
	puts("请输入寻找的宠物品种");
	s_gets(temp.petkind, SLEN);
	uppercase(temp.petname);
	uppercase(temp.petkind);
	printf("%s , %s", temp.petname,temp.petkind);
	if (InTree(&temp,pt))
		printf("是一个成员\n");
	else
		printf("不是一个成员\N");
}

//删除宠物节点
void droppet(Tree* pt)
{
	Item temp;
	
	if (TreeIsEmpty(pt))
	{
		puts("没有这个");
		return;
	}
	
	puts("请输入你想要删除的宠物的名字");
	s_gets(temp.petname, SLEN);
	puts("请输入宠物种类");
	s_gets(temp.petkind, SLEN);
	uppercase(temp.petname);
	uppercase(temp.petkind);
	printf("#s , %s", temp.petname,temp.petkind);
	if (DeleteItem (&temp, pt)) 
		printf("成功被俱乐部移除");
	else 
		printf("并不是一个对象");
}

//遍历树的函数
void uppercase (char* str)
{
	while (*str)
	{
		*str = toupper (*str);
		str++;
	}
}

//输入函数
char* s_gets(char* st, int n)
{
	char* ret_val;
	char* find;
	
	ret_val = fgets(st, n, stdin);
	if(ret_val)
	{
		find = strchr(st,'\n');
		if(find)
			*find = '0';
		else
			while (getchar() != '\n')
				continue;
	}
	return ret_val;
}